/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.gbvbahia.projeto.service;

import br.com.gbvbahia.projeto.entidades.Usuario;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

/**
 * Classe para autenticação de usuários.
 *
 * @since 30/04/2012
 * @author Guilherme
 */
@Component(value = "authenticationService")
public class AuthenticationService {

    /**
     * Registra os eventos para debug em desenvolvimento.
     */
    private Logger logger = Logger.getLogger(AuthenticationService.class);
    /**
     * Autenticador do SpringSecurity.
     */
    @Autowired
    @Qualifier("authenticationManager")
    private AuthenticationManager authenticationManager;

    /**
     * Realiza o login conforme login e senha informado.
     *
     * @param login Login
     * @param senha Senha
     * @return True para ok, logado. False para ÑOK não logado.
     */
    public boolean login(final String login, final String senha) {
        try {
            UsernamePasswordAuthenticationToken token =
                    new UsernamePasswordAuthenticationToken(login, senha);
            Authentication authenticate =
                    authenticationManager.authenticate(token);
            if (authenticate.isAuthenticated()) {
                SecurityContextHolder.getContext().setAuthentication(authenticate);
                return true;
            }
        } catch (AuthenticationException e) {
            logger.warn("Tentativa de login inválido: Login: "
                    + login);
//            logger.fatal("SOMENTE EM DESENVOLVIMENTO: Senha Digitada:"
//                    + senha + " Senha Criptografada: "
//                    + Base64Encoder.encryptPassword(senha));
        }
        return false;
    }

    /**
     * Remove o usuário do contexto de autenticação do Spring.<br> Se
     * a autenticação for em um sistema WEB o mesmo deverá invalidar a
     * sessão.
     */
    public void logout() {
        SecurityContextHolder.getContext().setAuthentication(null);
        FacesContext jsf = FacesContext.getCurrentInstance();
        ExternalContext externalContext = jsf.getExternalContext();
        HttpSession session = (HttpSession) externalContext.getSession(false);
        session.invalidate();
    }

    /**
     * Retorna o usuário autenticado no contexto do Spring.
     *
     * @return Usuario Logado.
     */
    public Usuario getUsuarioLogado() {
        return (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
}
